package com.my.springboot.tuling.jvm.gc;

import com.my.springboot.tuling.jvm.bean.User;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 示例：finalize()方法最终判定对象是否存活
 * 即使在可达性分析算法中不可达的对象，也并非是“非死不可”的，这时候它们暂时处于“缓刑”阶段，要真正宣告一
 * 个对象死亡，至少要经历再次标记过程。
 * 标记的前提是对象在进行可达性分析后发现没有与GC Roots相连接的引用链。
 * 1. 第一次标记并进行一次筛选。
 * 筛选的条件是此对象是否有必要执行finalize()方法。
 * 当对象没有覆盖finalize方法，对象将直接被回收。
 * 2. 第二次标记
 * 如果这个对象覆盖了finalize方法，finalize方法是对象脱逃死亡命运的最后一次机会，如果对象要在finalize()中成功拯救
 * 自己，只要重新与引用链上的任何的一个对象建立关联即可，譬如把自己赋值给某个类变量或对象的成员变量，那在第
 * 二次标记时它将移除出“即将回收”的集合。如果对象这时候还没逃脱，那基本上它就真的被回收了。
 * 注意：一个对象的finalize()方法只会被执行一次，也就是说通过调用finalize方法自我救命的机会就一次。
 */
public class OOMTest {
    public static List<User> list = new ArrayList<>();
    public static void main(String[] args) {
        List<Object> list = new ArrayList<>();
        int i = 0;
        int j = 0;
        while (true) {
            list.add(new User(i++, UUID.randomUUID().toString()));
            new User(j--, UUID.randomUUID().toString());
        }
    }
}
